package 代码随想录_动态规划;

/**
 * @author zx
 * @create 2022-05-24 10:39
 * 为什么要先确定递推公式，然后在考虑初始化呢？
 * 因为一些情况是递推公式决定了dp数组要如何初始化！
 * 组成部分一：确定状态
 *               最后一步：
 *               子问题：
 *               确定dp数组(dp table)以及下标的含义
 * 组成部分一：确定状态
 * 最后一步：
 * 子问题：
 * 组成部分二：转移方程
 * 组成部分三：初始条件和边界情况
 * 组成部分四：计算顺序
 *
 *
 * 代码随想录：
 * 对于动态规划问题, 拆解为如下五步曲, 这五步都搞清楚了, 才能说把动态规划真的掌握了！
 * 1.确定dp数组（dp table）以及下标的含义
 * 2.确定递推公式
 * 3.dp数组如何初始化
 * 4.确定遍历顺序
 * 5.举例推导dp数组
 * 一些同学可能想为什么要先确定递推公式，然后在考虑初始化呢？
 * 因为一些情况是递推公式决定了dp数组要如何初始化！！！！！
 *
 * 写动规题目，代码出问题很正常！
 * 找问题的最好方式就是把dp数组打印出来，看看究竟是不是按照自己思路推导的！
 *
 *
 *
 * 一些同学对于dp的学习是黑盒的状态，就是不清楚dp数组的含义，不懂为什么这么初始化，递推公式背下来了，
 * 遍历顺序靠习惯就是这么写的，然后一鼓作气写出代码，如果代码能通过万事大吉，通过不了的话就凭感觉改一改。
 * 这是一个很不好的习惯！
 *
 * 做动规的题目，写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍，心中有数，确定最后推出的是想要的结果。
 * 然后再写代码，如果代码没通过就打印dp数组，看看是不是和自己预先推导的哪里不一样。
 * 如果打印出来和自己预先模拟推导是一样的，那么就是自己的递归公式、初始化或者遍历顺序有问题了。
 * 如果和自己预先模拟推导的不一样，那么就是代码实现细节有问题。
 * 这样才是一个完整的思考过程，而不是一旦代码出问题，就毫无头绪的东改改西改改，最后过不了，或者说是稀里糊涂的过了。
 * 这也是我为什么在动规五步曲里强调推导dp数组的重要性。
 *
 * 
 * 1.确定dp数组（dp table）以及下标的含义
 *
 * 2.确定递推公式
 *
 * 3.dp数组如何初始化
 *
 * 4.确定遍历顺序
 *
 * 5.举例推导dp数组
 */
public class Test {

}

